 1.电商分析之--会员活跃度之日志数据采集中采集启动日志(使用自定义拦截器)
   
   1).定义配置文件
   /data/lagoudw/conf/flume-log2hdfs2.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# taildir source
a1.sources.r1.type = TAILDIR
a1.sources.r1.positionFile =/data/lagoudw/conf/startlog_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /data/lagoudw/logs/start/.*log
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type =cn.lagou.dw.flume.interceptor.CustomerInterceptor$Builder

# memorychannel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 100000
a1.channels.c1.transactionCapacity = 2000
# hdfs sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /user/data/logs/start/dt=%{logtime}/
a1.sinks.k1.hdfs.filePrefix = startlog.
a1.sinks.k1.hdfs.fileType = DataStream

# 配置文件滚动方式（文件大小32M）
a1.sinks.k1.hdfs.rollSize = 33554432
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.idleTimeout = 0
a1.sinks.k1.hdfs.minBlockReplicas = 1

# 向hdfs上刷新的event的个数
a1.sinks.k1.hdfs.batchSize = 1000

# 使用本地时间
# a1.sinks.k1.hdfs.useLocalTimeStamp = true

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

   修改：
        给source增加自定义拦截器
        去掉本地时间戳 a1.sinks.k1.hdfs.useLocalTimeStamp = true
        根据header中的logtime写文件
   2).启动服务
   # 测试
   flume-ng agent --conf /opt/lagou/servers/flume-1.9.0/conf --conf-file
 /data/lagoudw/conf/flume-log2hdfs2.conf -name a1 -Dflume.root.logger=INFO,console
   3).拷贝日志
   [root@linux122 start]# cp /data/start0730.log ./start2.log
   4).检查HDFS文件
   hdfs dfs -ls /user/data/logs/start/
   [root@linux122 start]# hdfs dfs -ls /user/data/logs/start/dt=2020-07-31
   hdfs dfs -cat /user/data/logs/start/dt=Unknown/*
   */
 2.采集启动日志和事件日志
   
   本系统中要采集两种日志：启动日志、事件日志，不同的日志放置在不同的目录下。
   要想一次拿到全部日志需要监控多个目录。
   总体思路
   1)、taildir监控多个目录
   2)、修改自定义拦截器，不同来源的数据加上不同标志
   3)、hdfs sink 根据标志写文件
   Agent配置
   /data/lagoudw/conf/flume-log2hdfs3.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# taildir source
a1.sources.r1.type = TAILDIR
a1.sources.r1.positionFile =/data/lagoudw/conf/startlog_position.json
a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1 = /data/lagoudw/logs/start/.*log
a1.sources.r1.headers.f1.logtype = start
a1.sources.r1.filegroups.f2 = /data/lagoudw/logs/event/.*log
a1.sources.r1.headers.f2.logtype = event

# 自定义拦截器
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type =cn.lagou.dw.flume.interceptor.LogTypeInterceptor$Builder

# memorychannel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 100000
a1.channels.c1.transactionCapacity = 2000

# hdfs sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /user/data/logs/%{logtype}/dt=%{logtime}/
a1.sinks.k1.hdfs.filePrefix = startlog.
a1.sinks.k1.hdfs.fileType = DataStream

# 配置文件滚动方式（文件大小32M）
a1.sinks.k1.hdfs.rollSize = 33554432
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.idleTimeout = 0
a1.sinks.k1.hdfs.minBlockReplicas = 1

# 向hdfs上刷新的event的个数
a1.sinks.k1.hdfs.batchSize = 1000

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
   
   filegroups
   指定filegroups，可以有多个，以空格分隔(taildir source可同时监控多个目录中的
文件)
   headers.<filegroupName>.<headerKey>
   给 event 增加header key。不同的filegroup，可配置不同的value
   
   自定义拦截器
   编码完成后打包上传服务器，放置在$FLUME_HOME/lib 下
   测试
   启动Agent，拷贝日志，检查HDFS文件
   # 清理环境
   
   rm -f /data/lagoudw/conf/startlog_position.json
   rm -f /data/lagoudw/logs/start/*.log
   rm -f /data/lagoudw/logs/event/*.log
   */
   # 启动 Agent
   flume-ng agent --conf /opt/lagou/servers/flume-1.9.0/conf --conf-file
 /data/lagoudw/conf/flume-log2hdfs3.conf -name a1 -Dflume.root.logger=INFO,console

  
   # 拷贝日志
   cd /data/lagoudw/logs/
   cp source/event0728.log event/event5.log
   cp source/event0729.log event/event2.log
   cp source/event0730.log event/event3.log
   cp source/event0731.log event/event4.log
   cp source/start0728.log start/start5.log
   cp source/start0729.log start/start2.log
   cp source/start0730.log start/start3.log
   cp source/start0731.log start/start4.log
   # 检查HDFS文件
   hdfs dfs -ls /user/data/logs/event
   hdfs dfs -rm -r -f /user/data/logs/event/*
   */
   hdfs dfs -ls /user/data/logs/start

   hdfs dfs -rm -r -f /user/data/logs/start/*
   */
  
   # 生产环境中用以下方式启动Agent
   nohup flume-ng agent --conf /opt/lagou/servers/flume-1.9.0/conf --conf-file
 /data/lagoudw/conf/flume-log2hdfs3.conf -name a1 -
Dflume.root.logger=INFO,LOGFILE > /dev/null 2>&1 &
   
   nohup，该命令允许用户退出帐户/关闭终端之后继续运行相应的进程
   /dev/null，代表linux的空设备文件，所有往这个文件里面写入的内容都会丢
失，俗称黑洞
   标准输入0，从键盘获得输入 /proc/self/fd/0
   标准输出1，输出到屏幕（控制台） /proc/self/fd/1
   错误输出2，输出到屏幕（控制台） /proc/self/fd/2
   >/dev/null 标准输出1重定向到 /dev/null 中，此时标准输出不存在，没有任
何地方能够找到输出的内容
   2>&1 错误输出将会和标准输出输出到同一个地方
   >/dev/null 2>&1 不会输出任何信息到控制台，也不会有任何信息输出到文件中
 
 3.日志数据采集小结
   
   1).使用taildir source 监控指定的多个目录，可以给不同目录的日志加上不同
header
   2).在每个目录中可以使用正则匹配多个文件
   3).使用自定义拦截器，主要功能是从json串中获取时间戳，加到event的header中
   4).hdfs sink使用event header中的信息写数据(控制写文件的位置)
   5).hdfs文件的滚动方式(基于文件大小、基于event数量、基于时间)
   6).调节flume jvm内存的分配
   